package com.bjsxt.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bjsxt.domain.User;
import com.bjsxt.dto.*;
import com.bjsxt.model.UserVo;

import java.util.List;
import java.util.Map;

public interface UserService extends IService<User> {
    /**
     * 根据手机号, 会员的 id, 用户名, 真实姓名, 状态分页查询员工数据
     *
     * @param page          分页对象<User>
     * @param mobile        手机号
     * @param userId        会员的 id, 精确查询
     * @param userName      用户名
     * @param realName      真实姓名
     * @param status        状态 0: 禁用 1: 启用
     * @param reviewsStatus 审核状态,1通过,2拒绝,0,待审核
     * @return 员工分页数据
     */
    Page<User> pageByMobileAndUserIdAndUserNameAndRealNameAndStatusAndReviewsStatus(Page<User> page, String mobile, Long userId, String userName, String realName, Integer status, Integer reviewsStatus);

    /**
     * 通过用户的 ID 查询该用户的邀请的人员
     *
     * @param page   分页对象<User>
     * @param userId 用户的 id
     * @return 员工分页数据
     */
    Page<User> pageDirectInvitesByUserId(Page<User> page, Long userId);

    /**
     * 审核
     *
     * @param id            会员的 id
     * @param reviewsStatus 审核状态,1通过,2拒绝,0,待审核
     * @param authCode      一组图片的唯一标识
     * @param remark        审核拒绝的原因(非必填)
     * @return 统一响应对象
     */
    boolean audit(Long id, Byte reviewsStatus, Long authCode, String remark);

    /**
     * 用户实名认证
     *
     * @param userId   用户 id
     * @param identify 用户实名认证数据对象
     * @return true 认证成功 false 认证失败
     */
    boolean identifyValidate(Long userId, IdentifyDto identify);

    /**
     * 根据用户 id 获取用户视图层对象
     *
     * @param id 用户 id
     * @return 用户信息对象
     */
    UserVo getUserVoById(Long id);

    /**
     * 根据用户 id 对用户进行高级认证的操作
     * 高级认证->高级认证审核
     *
     * @param userId 用户 id
     * @param imgs   用户上传的身份证图片列表
     * @return true 保存成功 false 保存失败
     */
    boolean authUser(Long userId, List<String> imgs);

    /**
     * 修改用户的手机号码
     *
     * @param userId      需要进行修改手机号的用户 ID
     * @param updatePhone 修改用户手机号的参数实体对象
     * @return true 修改成功 false 修改失败
     */
    boolean updatePhone(Long userId, UpdatePhoneDto updatePhone);

    /**
     * 校验手机号的可用状态，可用则进行发送验证码
     *
     * @param countryCode  电话的国家区号
     * @param mobile       需要验证的手机号
     * @param templateCode 短信模板ID
     * @return true 校验可用 false 校验不可用
     */
    boolean checkPhone(String countryCode, String mobile, String templateCode);

    /**
     * 根据用户 id 修改用户的登录密码
     *
     * @param userId         用户 id
     * @param updatePassword 用户修改密码的参数实体类
     * @return true 修改成功 false 修改失败
     */
    boolean updateLoginPassword(Long userId, UpdatePasswordDto updatePassword);

    /**
     * 根据用户 id 修改用户的支付密码
     *
     * @param userId         用户 id
     * @param updatePassword 用户修改密码的参数实体类
     * @return true 修改成功 false 修改失败
     */
    boolean updatePayPassword(Long userId, UpdatePasswordDto updatePassword);

    /**
     * 根据用户 id 重新设置用户的交易密码
     *
     * @param userId           用户 id
     * @param resetPayPassword 重置用户密码的参数实体对象
     * @return true 重置成功 false 重置失败
     */
    boolean resetPayPassword(Long userId, ResetPayPasswordDto resetPayPassword);

    /**
     * 根据用户 ID 查询用户的邀请列表数据
     *
     * @param userId 用户 ID
     * @return 用户的邀请列表
     */
    List<User> getUserInvites(Long userId);

    /**
     * 根据用户的 ID 集合查询用户的基本数据信息
     *
     * @param ids 用户的 id 集合
     * @return 用户基本信息数据集合
     */
    List<UserDto> listBasicByIds(List<Long> ids);

    /**
     * 用户的注册
     *
     * @param registerDto 注册用户的参数实体对象
     * @return true 注册成功 false 注册失败
     */
    boolean register(RegisterDto registerDto);

    /**
     * 找回用户的登录密码
     *
     * @param setPasswordDto 找回用户登录密码的参数实体类
     * @return true 找回成功 false 找回失败
     */
    boolean setLoginPassword(SetPasswordDto setPasswordDto);

    /**
     * 根据用户的 id 集合，用户的名称，用户的手机号进行查询用户的基本数据
     *
     * @param ids      用户的 id 集合
     * @param userName 用户名
     * @param mobile   手机号
     * @return key: 用户的 id，value:用户基本信息数据
     */
    Map<Long, UserDto> listBasicByIdsAndUserNameAndMobile(List<Long> ids, String userName, String mobile);
}
